# Правила оформления кода в 1С

1. [Общие требования](#1-Общие-требования)  
    1.1. [Язык модулей](#11-Язык-модулей)  
    1.2. [Использование букву "ё"](#12-Использование-буквы-ё)  
    1.3. [Неиспользуемые процедуры и функции](#13-Неиспользуемые-процедуры-и-функции)  
    1.4. [Последовательность операторов](#14-Последовательность-операторов)  
    1.5. [Синтаксический отступ](#15-Синтаксический-отступ)  
    1.6. [Длина строк](#16-Длина-строк)  
2. [Комментарии](#2-Комментарии)
3. [Имена переменных](#3-Имена-переменных)
4. [Имена процедур и функций](#4-Имена-процедур-и-функций)
5. [Параметры процедур и функций](#5-Параметры-процедур-и-функций)
6. [Сложные конструкции](#6-Сложные-конструкции)
7. [Условия](#7-Условия)
8. [Стандарты от фирмы 1С](#8-Стандарты-от-фирмы-1С)


## 1. Общие требования

### 1.1. Язык модулей
Тексты модулей должны быть написаны на русском языке.
Исключения могут составлять методы soap и http-сервисов, а также идентификаторы внешних информационных систем.

### 1.2. Использование буквы "ё"
В текстах модулей не допускается использовать букву "ё", за исключением ситуаций, когда она используется в выводимых пользовавателю сообщениях.

### 1.3. Неиспользуемые процедуры и функции
Модули не должны иметь неиспользуемых процедур и функций.

### 1.4. Последовательность операторов
Тексты модулей необходимо оформлять по принципу "один оператор в одной строке".

**Хорошо**
```bsl
    Если ПроверитьЗаполнение() Тогда 
        Возврат; 
    КонецЕсли;
```

**Плохо**
```bsl
    Если ПроверитьЗаполнение() Тогда Возврат; КонецЕсли;
```

### 1.5. Синтаксический отступ
Текст модуля необходимо оформлять синтаксическим отступом. Для синтаксического отсутпа используется таблуляция.

С крайней левой позиции начинаются только:
- операторы Процедура, КонецПроцедуры, Функция, КонецФункции; 
- операторы предварительного объявления процедур и функций; 
- заголовки (описания) процедур и функций; 
- объявление переменных модуля; 
- операторы "раздела основной программы" (с учетом синтаксического отступа);
- директивы компилятора &НаКлиенте, &НаСервере и т.д.
- инструкции препроцессора (в т.ч. #Область и #КонецОбласти)

Внутри ветвлений и циклов отступ увеличивается на одни символ табуляции. Для автоматического выравнивания можно воспользоваться горячими клавишами Shift+Alt+F в конфигураторе.

**Хорошо**
```bsl
	Для Каждого ДанныеСтроки Из ДанныеФайла Цикл
		
		Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеСтроки.НаименованиеНоменклатуры);		
		
		Если Не ЗначениеЗаполнено(Номенклатура) Тогда
			
			ШаблонСообщения = НСтр("ru = 'Номенклатура: %1 не найдена'");
			
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СтрШаблон(ШаблонСообщения, ДанныеСтроки.НаименованиеНоменклатуры);
			Сообщение.Сообщить();
			
			Продолжить;
			
		КонецЕсли;
		
		НоваяСтрокаТЧ = ДокументЦены.Товары.Добавить();
		НоваяСтрокаТЧ.Номенклатура = Номенклатура;
		НоваяСтрокаТЧ.Цена = ДанныеСтроки.Цена;
		
	КонецЦикла;
```

**Плохо**
```bsl
    Для Каждого ДанныеСтроки Из ДанныеФайла Цикл
		
        Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеСтроки.НаименованиеНоменклатуры);		
    
    Если Не ЗначениеЗаполнено(Номенклатура) Тогда
    
    ШаблонСообщения = НСтр("ru = 'Номенклатура: %1 не найдена'");
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = СтрШаблон(ШаблонСообщения, ДанныеСтроки.НаименованиеНоменклатуры);
    Сообщение.Сообщить();
    
    Продолжить;
    
    КонецЕсли;
    
    НоваяСтрокаТЧ = ДокументЦены.Товары.Добавить();
    НоваяСтрокаТЧ.Номенклатура = Номенклатура;
    НоваяСтрокаТЧ.Цена = ДанныеСтроки.Цена;
		
	    КонецЦикла;
```

### 1.6. Длина строк
Длина строк не должна быть более 120 символов. Исключение - длинные строковые константы, которые должны выводится без переноса.

## 2. Комментарии

В текстах модулей можно оставлять комментарии. Они предназначены для пояснения работы модуля или комментируемого оператора. Тексты комментариев должны быть составлены по правилам русского языка, в деловом стиле и не содержать информацию, не относящуюся к функциональности программы.

Между символами комментария "//" и текстом комментария должен быть пробел.

Недопускается наличие в текстах модулей закомментированного кода, а также фрагментов, которые связаны в процессом разработки (служебные отметки, TODO, MRG и т.д.).

## 3. Имена переменных

Имена переменных необходимо образовывать из терминов предметрой области, чтобы из имени было понятно ее назначение. Имена образовываются удалением пробелов между словами. При этом каждое слово пишется с большой буквы. Предлоги и местоимения из одной буквы также пишутся большими буквами.

Имена переменных не должны начинаться с подчеркивания или состоять из одного символа. Переменные не должны содержать отрицания в имени.

**Плохо**
```bsl
Перем _д;
Перем ПроверкаНеПройдена;
Перем ОстТов;
```

**Хорошо**
```bsl
Перем ДиалогВыбораФайла;
Перем ПроверкаПройдена;
Перем ОстатовТовараНаСкладе;
```

## 4. Имена процедур и функций
Имена процедур, функций и их параметров следует образовывать от терминов предметной области, чтобы из имени было понятно назначения. Имена должны документировать сами себя.

**Плохо**
```bsl
Процедура ЗаписатьТовары()
Функция Получить(Путь)
```

**Хорошо**
```bsl
Процедура СформироватьДвиженияТовары()
Функция ДанныеСайта(АдресСайта)
```

## 5. Параметры процедур и функций
Параметры должны идти в логической последовательности. Лучше располагать их от общего к частному.

Необязательные параметры должны располагаться после обязательных
```bsl
Функция КурсВалютыНаДату(Валюта, Дата = Неопределено) Экспорт
```

Не должно быть более 7 параметров. В идеале не более 4. При необходимости передавать в процедуру или функцию большое число параметров рекомендуется:
- группировать однотивные параметры в один или несколько составных параметров типа Структура;
- либо полностью пересмотреть логику работы, разделв на несколько разных, более простых процедур и функций.

## 6. Сложные конструкции
Не рекомендуется при передаче параметров в одну функцию применять вложенные вызовы других функций:

**Плохо**
```bsl
СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, Новый Картинка(ПолучитьИзВременногоХранилища(ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла)));
```

Лучше разбивать такие вызовы на отдельные строки с помощью вспомогательных локальных переменных:

**Хорошо**
```bsl
АдресФайлаИзображения = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла;
ДанныеИзображения = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайлаИзображения));
СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, ДанныеИзображения);
```

Не рекомендуется использовать конструктор структуры с большым количеством свойство (более 2):

**Плохо**
```bsl
ПараметрыЗаполнения = Новый Структура("Дата, Организация, Контрагент, Договор", ТекущаяДата(), Строка.Организация, Строка.Контрагент, Строка.Договор)
```

**Хорошо**
```bsl
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Дата", ТекущаяДата());
ПараметрыЗаполнения.Вставить("Организация", Строка.Организация);
ПараметрыЗаполнения.Вставить("Контрагент", Строка.Контрагент);
ПараметрыЗаполнения.Вставить("Договор", Строка.Договор);
```

## 7. Условия

Желательно не использовать тернарный оператор, вместо него использовать функцию с понятным именем.

**Плохо**
```bsl
НДС = Сумма * ?(СтавкаНДС = "НДС0", 0, 20);
```

**Хорошо**
```bsl
НДС = Сумма * ПроцентНДС(СтавкаНДС);
```

Сложные условия (содержащие 3 конструкции и более) лучше выносить в отдельные методы:

**Плохо**
```bsl
Если ИдентификаторОбъекта = "АнализСубконто"
    ИЛИ ИдентификаторОбъекта = "АнализСчета"
    ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость"
    ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету"
    ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто"
    ИЛИ ИдентификаторОбъекта = "ОборотыСчета"
    ИЛИ ИдентификаторОбъекта = "СводныеПроводки" 
    ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига"
    ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость" Тогда
    ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь);
		
    ЕстьПоказатель  = Ложь;
    ЕстьКорЗначение = Ложь;
    ЕстьСчет        = Истина;
    Счет            = Неопределено;
    ПервыйЭлемент   = Неопределено;
КонецЕсли;
```

**Хорошо**
```bsl
Если ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта) Тогда
    ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь);
		
    ЕстьПоказатель  = Ложь;
    ЕстьКорЗначение = Ложь;
    ЕстьСчет        = Истина;
    Счет            = Неопределено;
    ПервыйЭлемент   = Неопределено;
КонецЕсли;

Функция ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта)
	
    Возврат ИдентификаторОбъекта = "АнализСубконто"
        ИЛИ ИдентификаторОбъекта = "АнализСчета"
        ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость"
        ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету"
        ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто"
        ИЛИ ИдентификаторОбъекта = "ОборотыСчета"
        ИЛИ ИдентификаторОбъекта = "СводныеПроводки" 
        ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига"
        ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость";

КонецФункции
```

## 8. Стандарты от фирмы 1С
Подробные рекомендации по разработке на платформе доступны на сайте 1С:ИТС по [ссылке](https://its.1c.ru/db/v8std).
